home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / mc302emb.zip / BJ.C < prev    next >
C/C++ Source or Header  |  1994-03-18  |  3KB  |  114 lines

  1. /*
  2.  * Very simple BLACKJACK (21) game
  3.  */
  4.  
  5. #include cflea.h
  6.  
  7. #define    DECK    52
  8. #define    SUITES    4
  9.  
  10. /*
  11.  * Keep track of money and bet, play game & adjust total
  12.  */
  13. main()
  14. {
  15.     unsigned money, bet;
  16.     char inbuf[11];
  17.  
  18.     money = 1000;
  19.     for(;;) {
  20.         printf("\nYou have %u dollars.\nHow much would you like to bet?", money);
  21.         getstr(inbuf, 10);
  22.         if(!(bet = atoi(inbuf))) {
  23.             putstr("No bet - No game!\n");
  24.             return; }
  25.         if(bet > money) {
  26.             putstr("You don't have that much money!");
  27.             continue; }
  28.         if(!(money += blackjack() ? bet : -bet)) {
  29.             putstr("You went BUST!\n");
  30.             return; } }
  31. }
  32.  
  33. /*
  34.  * Play a single 21 game
  35.  */    
  36. blackjack()
  37. {
  38.     int deck[DECK], i, j, t, player_total, dealer_total, next_card;
  39.  
  40.     player_total = dealer_total = next_card = 0;
  41.  
  42.     /* Deal a deck of cards */
  43.     for(i=0; i < DECK; ++i)
  44.         deck[i] = i;
  45.     for(i=0; i < DECK; ++i) {
  46.         t = deck[i];
  47.         deck[i] = deck[j = rand(DECK)];
  48.         deck[j] = t; }
  49.  
  50.     /* Accept player cards */
  51.     for(;;) {
  52.         printf("Player: %-4u", player_total);
  53.         if(player_total > 21) {
  54.             putstr("You LOSE!\n");
  55.             return 0; }
  56.         if(get_input("Another card (Y/N)", "YN") == 'N')
  57.             break;
  58.         show_card(i = deck[next_card++]);
  59.         if(!(i %= (DECK/SUITES))) {
  60.             if(get_input("1 or Ten?", "1T") == 'T')
  61.                 i = 9; }
  62.         player_total += (i > 9) ? 10 : i+1; }
  63.  
  64.     /* Play dealer */
  65.     for(;;) {
  66.         printf("Dealer: %-4u", dealer_total);
  67.         if(dealer_total > 21) {
  68.             putstr("You WIN!\n");
  69.             return 1; }
  70.         if(dealer_total >= player_total) {
  71.             putstr("Dealer wins!\n");
  72.             return 0; }
  73.         show_card(i = deck[next_card++]);
  74.         if(!(i %= (DECK/SUITES))) {
  75.             t = dealer_total + 10;
  76.             if((t < 22) && ((t >= player_total) || (t < 10)))
  77.                 i = 9;
  78.             printf("Dealer choses: %u\n", i+1); }
  79.         dealer_total += (i > 9) ? 10 : i+1; }
  80. }
  81.  
  82. /*
  83.  * Get input character with prompt, and validate
  84.  */
  85. get_input(prompt, allowed)
  86.     char prompt[], allowed[];
  87. {
  88.     int i;
  89.     char buffer[50], *ptr, c;
  90.  
  91.     for(;;) {
  92.         printf("%s?", prompt);
  93.         getstr(ptr = buffer, sizeof(buffer)-1);
  94.         while(isspace(c = toupper(*ptr)))
  95.             ++ptr;
  96.         for(i = 0; allowed[i]; ++i)
  97.             if(c == allowed[i])
  98.                 return c;
  99.         printf("Huh?\n"); }
  100. }
  101.  
  102. /*
  103.  * Display a card
  104.  */
  105. show_card(card)
  106.     int card;
  107. {
  108.     static char *suites[] = { "Hearts", "Diamonds", "Clubs", "Spades" };
  109.     static char *cards[] = { "Ace", "Two", "Three", "Four", "Five", "Six",
  110.         "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King" };
  111.  
  112.     printf("%s of %s\n", cards[card % (DECK/SUITES)], suites[card / (DECK/SUITES)]);
  113. }
  114.